﻿#include<iostream>

using namespace std;
//
//引用的概念和特性
//int main()
//{
//	int a = 1;
//	int& ra = a;//引用：取别名，共用同一块存储空间
//	int& b = a;//可以对同一变量取多个别名
//	int& rb = b;//也可以给别名取别名
//	int& r;//err:引用必须初始化
//	//引用别名只能引用一个实体，不能改变
//	int k = 0;
//	rb = k;//这里是赋值拷贝，不属于引用
//	return 0;
//}

////////////////////////////////////////////////////////////////////////////////////////////////////////////

//引用的使用

//这里就是引用的使用之一：引用传参，这种方法代替了指针，不需要传地址，而是直接将别名传过来，通过改变别名来改变变量本身
//void swap(int& x, int& y)
//{
//	int temp = x;
//	x = y;
//	y = temp;
//}
//
//int main()
//{
//	int a = 1, b = 2;
//	swap(a, b);
//	cout << a << ' ' << b << endl;
//	return 0;
//}

//typedef int STDataType;
//typedef struct Stack
//{
//	STDataType* a;
//	int top;
//	int capacity;
//}ST;
//void STInit(ST& rs, int n = 4)
//{
//	rs.a = (STDataType*)malloc(n * sizeof(STDataType));
//	rs.top = 0;
//	rs.capacity = n;
//}
//// 栈顶
//void STPush(ST& rs, STDataType x)
//{
//	// 满了， 扩容
//	if (rs.top == rs.capacity)
//	{
//		printf("扩容\n");
//		int newcapacity = rs.capacity == 0 ? 4 : rs.capacity * 2;
//		STDataType* tmp = (STDataType*)realloc(rs.a, newcapacity *
//			sizeof(STDataType));
//		if (tmp == NULL)
//		{
//			perror("realloc fail");
//			return;
//		}
//		rs.a = tmp;
//		rs.capacity = newcapacity;
//	}
//	rs.a[rs.top] = x;
//	rs.top++;
//}
////引用的另一种使用：引用做返回值
//
////int STTop(ST& rs)//传值返回就会拷贝形成临时对象，然后再将临时对象返回给实参，临时对象具有常性，不能被修改
////{
////	int top= rs.a[rs.top - 1];
////	return top;
////}
//
//int& STTop(ST& rs)//引用返回就不需要拷贝，直接返回别名
//{
//	return rs.a[rs.top-1];
//}
//
//int& STTop(ST& rs)
//{
//	int top = rs.a[rs.top - 1];
//	return top;
//	//这种情况下，编译器可能不报错，但是却是错误的，top被销毁了无法返回值
//	//这个和引用返回值是不同的，不会涉及到给目标空间取别名
// //这种情况可以叫做野别名
//}
//
//int main()
//{
//	// 调⽤全局的
//	ST st1;
//	STInit(st1);
//	STPush(st1, 1);
//	STPush(st1, 2);
//	cout << STTop(st1) << endl;
//	STTop(st1) += 10;
//	cout << STTop(st1) << endl;
//	return 0;
//}

////////////////////////////////////////////////////////////////////////////////////////////////////////////

//const引用

//int main()
//{
//	int a = 1;
//	const int& ra = a;//权限的缩小
//	const int& b = 0;//权限的平移
//
//	//int& rb = b;//权限的放大
//	/*int& r = 1;*/
//
//	int rb = b;//普通对象不涉及权限，这里就只是赋值
//
//	//指针也涉及权限的放大缩小
//	//int* pa = &ra;//权限的放大
//	const int* pa = &ra;//权限的缩小
//
//	//表达式
//	/*int& c = a * 2;*///权限的放大，涉及临时对象
//	const int& c = a * 2;//表达式的引用要用const引用
//
//	//类型转换
//	double p = 1.1;
//	int d = p;
//	/*int& rd = p;*/// 这里也涉及权限的放大
//	//发生类型转换是所转换的值也是先存储在临时对象中的
//	const int& rd = p;
//
//	return 0;
//}

////////////////////////////////////////////////////////////////////////////////////////////////////////////

//指针与引用的关系

int main()
{
	int a = 1;
	int* pa = &a;

	int b = 1;
	int& rb = b;
	return 0;
}